package crypto;

import gnu.crypto.Registry;
import gnu.crypto.key.IKeyPairGenerator;
import gnu.crypto.key.KeyPairGeneratorFactory;
import gnu.crypto.key.dss.DSSKeyPairGenerator;

import java.io.IOException;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.DSAPrivateKey;
import java.security.interfaces.DSAPublicKey;
import java.util.HashMap;

import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

/**
 * Clase que genera diversos tipos de llaves y los guarda en una locacion especificada
 */
public class KeyMaker
{
	/**
	 * genera una llave con el algoritmo AES
	 */
	public static void generateAES()
	{		
		try {
			KeyGenerator kgen = KeyGenerator.getInstance("AES");
			kgen.init(128);

			SecretKey skey = kgen.generateKey();
			byte[] raw = skey.getEncoded();

			KeyUtils.saveKeyToFile(raw, "AES");
		} 
		catch (NoSuchAlgorithmException e) 
		{
			e.printStackTrace();
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
		}
	}

	/**
	 * genera una llave con el algoritmo HmacSHA1
	 */
	public static void generateHmacSHA1()
	{
		try {
			KeyGenerator kgen = KeyGenerator.getInstance("HmacSHA1");

			SecretKey skey = kgen.generateKey();
			byte[] raw = skey.getEncoded();
			
			KeyUtils.saveKeyToFile(raw, "HmacHSA1");
		} 
		catch (NoSuchAlgorithmException e) 
		{
			e.printStackTrace();
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
		}
	}

	/**
	 * Genera un par de llaves (Publica y Privada) con el algoritmo DSA
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static void generateDSAPair() 
	{
		IKeyPairGenerator kpg = KeyPairGeneratorFactory.getInstance(Registry.DSA_KPG); //DSS_KPG
		HashMap map = new HashMap();

		map.put(DSSKeyPairGenerator.MODULUS_LENGTH, new Integer(512));
		map.put(DSSKeyPairGenerator.USE_DEFAULTS, new Boolean(false));

		kpg.setup(map);
		KeyPair kp = kpg.generate();

		BigInteger p1 = ((DSAPublicKey) kp.getPublic()).getParams().getP();
		BigInteger p2 = ((DSAPrivateKey) kp.getPrivate()).getParams().getP();
		BigInteger q1 = ((DSAPublicKey) kp.getPublic()).getParams().getQ();
		BigInteger q2 = ((DSAPrivateKey) kp.getPrivate()).getParams().getQ();
		BigInteger g1 = ((DSAPublicKey) kp.getPublic()).getParams().getG();
		BigInteger g2 = ((DSAPrivateKey) kp.getPrivate()).getParams().getG();
		BigInteger y = ((DSAPublicKey) kp.getPublic()).getY();
		BigInteger x = ((DSAPrivateKey) kp.getPrivate()).getX();
		
		try
		{
			KeyUtils.saveDSAKeyToFile(y, p1, q1, g1, "DSAPublic");
			KeyUtils.saveDSAKeyToFile(x, p2, q2, g2, "DSAPrivate");
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
}
